﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using WebUI.Models;
using System.Text.RegularExpressions;


namespace WebUI.Controllers
{
    public class AccountController : _SiteBaseController
    {
        //public ActionResult TestAct(string A,string B,string submit)
        //{
        //    return View();
        //}
        //public ActionResult TaskList() {
        //    var h=DB.Hospitals.First(v => v.HospitalID == "10001");
        //    DB.Detach(h);
        //    h.HospitalID = "10002";
        //    DB.Hospitals.AddObject(h);
        //    DB.SaveChanges();

        //    return View();
        //}

        //public ActionResult SmsTest()
        //{
        //    var smsTest = WebUI.Services.SmsSessionSvc.Instance;
        //    //smsTest.SmsSendTimer = new System.Timers.Timer(5000);
        //    //smsTest.SmsSendTimer.AutoReset = false;
        //    //smsTest.SmsReadAndProcTimer = new System.Timers.Timer(5000);
        //    //smsTest.SmsReadAndProcTimer.AutoReset = false;
        //    smsTest.StartTimers(DateTime.Now.AddHours(1).Hour);

        //    return null;
        //}
        //public ActionResult SmsTestB(int T)
        //{
        //    if (T == 1)
        //    {
        //        var smsTest = WebUI.Services.SmsSessionSvc.Instance;
        //        smsTest.Debug_IsLog = true;
        //        smsTest.LogString = string.Empty;
        //        smsTest.DoSmsSend();
        //        return Content("<pre>"+smsTest.LogString+"</pre>");
        //    }
        //    else
        //    {
        //        var smsTest = WebUI.Services.SmsSessionSvc.Instance;
        //        smsTest.Debug_IsLog = true;
        //        smsTest.LogString = string.Empty;
        //        smsTest.DoReadAndProc();
        //        return Content("<pre>" + smsTest.LogString + "</pre>");           
        //    }

        //}

        //public ActionResult ImgIdx() {
        //    //string logfn = Server.MapPath("~/App_Data/log.txt");
        //    //System.IO.File.AppendAllText(logfn, "Start\r\n");

        //    var filedb = Server.MapPath("~/App_Data/FileDB");
        //    var exts=new string[]{".png", ".jpg", ".gif", ".jpeg"};
        //    string[] fns = System.IO.Directory.GetFiles(filedb).Select(v=>System.IO.Path.GetFileName(v)).Where(v=>exts.Contains( System.IO.Path.GetExtension(v).ToLower())).ToArray();
        //    string imgidxfile = Server.MapPath("~/App_Data/ImgIdx.txt");
        //    System.IO.File.WriteAllLines(imgidxfile,fns);
        //    return Content("img index done.["+fns.Length.ToString()+"]");
        //}

        //public ActionResult ToBCS()
        //{
        //    //string logfn = Server.MapPath("~/App_Data/log.txt");
        //    //System.IO.File.AppendAllText(logfn, DateTime.Now.ToString("HH:mm:ss.fff")+"\tStart\r\n");

        //    var filedb = Server.MapPath("~/App_Data/FileDB").TrimEnd('/')+"/";
        //    string imgidxfile = Server.MapPath("~/App_Data/ImgIdx.txt");
        //    string imgprocfile = Server.MapPath("~/App_Data/ImgPrc.txt");
        //    string[] fns = System.IO.File.ReadAllLines(imgidxfile);
        //    int all=0, sucessed=0, faild=0;
        //    using (var store = StorageLib.StorageFactory.GetDefaultStorageProvider())
        //    {
        //        for (int i = 0; i < fns.Length; i++)
        //        {
        //            all++;
        //            var fn = fns[i];
        //            try
        //            {
        //                store.PutFile("/FileDB/" + fn, filedb + fn);
        //                System.IO.File.AppendAllText(imgprocfile, fn + "\r\n");
        //                sucessed++;
        //            }
        //            catch (Exception ex)
        //            {
        //                try
        //                {
        //                    System.IO.File.AppendAllText(imgprocfile, fn + "[ERROR]" + ex.Message.Replace("\r\n", "$") + "\r\n");
        //                }
        //                catch
        //                {
        //                    System.IO.File.AppendAllText(imgprocfile, fn + "[ERROR]Unknow\r\n");
        //                }
        //                faild++;
        //            }
        //        }
        //    }
        //    return Content(string.Format( "OVER,{0},{1},{2}",all,sucessed,faild));

        //}

        //
        // GET: /Account/LogOn
        [HttpGet]
        public ActionResult LogOn(string admin,string V)
        {

            if (V == "PC")
            {
                return View();
            }
            else if (V == "Mobile")
            {
                return Redirect("http://3ai-mobile.chinacloudsites.cn/");
            }
            else
            {
                if (System.IO.File.Exists(Server.MapPath("~/app_offline.flag")) && admin != "yes" + DateTime.Now.ToString("ddHH"))
                {
                    return View("app_offline");
                }


                string u = Request.ServerVariables["HTTP_USER_AGENT"];
                Regex b = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                if ((b.IsMatch(u) || v.IsMatch(u.Substring(0, 4))))
                {
                    return View("ChooseAgent");
                }
                else {
                    return View();
                }
            }

        }

        //
        // POST: /Account/LogOn

        [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "用户名或密码错误.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

        //
        // GET: /Account/LogOff

        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();

            return RedirectToAction("Index", "Home");
        }

        //
        // GET: /Account/Register

        //public ActionResult Register()
        //{
        //    return View();
        //}

        //
        // POST: /Account/Register

        //[HttpPost]
        //public ActionResult Register(RegisterModel model)
        //{
        //    if (ModelState.IsValid)
        //    {
        //        // Attempt to register the user
        //        MembershipCreateStatus createStatus;
        //        Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

        //        if (createStatus == MembershipCreateStatus.Success)
        //        {
        //            FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
        //            return RedirectToAction("Index", "Home");
        //        }
        //        else
        //        {
        //            ModelState.AddModelError("", ErrorCodeToString(createStatus));
        //        }
        //    }

        //    // If we got this far, something failed, redisplay form
        //    return View(model);
        //}

        //
        // GET: /Account/ChangePassword

        [Authorize]
        public ActionResult ChangePassword()
        {
            return View();
        }

        //
        // POST: /Account/ChangePassword

        [Authorize]
        [HttpPost]
        public ActionResult ChangePassword(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {

                // ChangePassword will throw an exception rather
                // than return false in certain failure scenarios.
                bool changePasswordSucceeded;
                try
                {
                    MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
                    changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
                }
                catch (Exception)
                {
                    changePasswordSucceeded = false;
                }

                if (changePasswordSucceeded)
                {
                    return RedirectToAction("ChangePasswordSuccess");
                }
                else
                {
                    ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

        //
        // GET: /Account/ChangePasswordSuccess

        public ActionResult ChangePasswordSuccess()
        {
            return View();
        }


        public ActionResult SliderViewPage()
        {
            return View();
        }
        public ActionResult SliderView()
        {
            return PartialView();
        }

        public ActionResult ForgetPassword()
        {
            ViewBag.IsChanged = false;
            return View();
        }

        [HttpPost]
        public ActionResult ForgetPassword(GetPasswordModel model)
        {
            ViewBag.IsChanged = false;
            if (ModelState.IsValid)
            {
                var user = DB.aspnet_Users.FirstOrDefault(s => s.UserName == model.UserName && s.MobileAlias == model.MobilePhone);
                if (user != null)
                {
                    var newPassword = new Random().Next(123456, 987654).ToString();//Membership.GeneratePassword(6, 0);
                    var userMember = Membership.GetUser(model.UserName);
                    if (userMember != null)
                    {
                        userMember.ChangePassword(userMember.ResetPassword(), newPassword);
                        ViewBag.IsChanged = true;
                        var admin = DB.aspnet_Users.FirstOrDefault(s => s.UserName == "管理员");
                        DB.SmsSents.AddObject(new SmsSent()
                        {
                            ID = DB.NewID(),
                            ReceiverCode = user.MobileAlias,
                            SenderCode = admin.MobileAlias,
                            ReceiverName = user.UserName,
                            SenderName = admin.UserName,
                            TextMessage = "欢迎您使用三爱医疗随访平台，您的密码已重新生成，密码为：" + newPassword + "，请妥善保管好您的密码！",
                            SentTime = DateTime.Now,
                            ProcStatus = "发送",
                            SmsType = "找回密码"
                        });
                        DB.SaveChanges();
                    }
                    else
                    {
                        ModelState.AddModelError("", "用户名或手机号错误.");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "用户名或手机号错误.");
                }
            }

            // If we got this far, something failed, redisplay form
            return View();
        }

        #region Status Codes
        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // See http://go.microsoft.com/fwlink/?LinkID=177550 for
            // a full list of status codes.
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "User name already exists. Please enter a different user name.";

                case MembershipCreateStatus.DuplicateEmail:
                    return "A user name for that e-mail address already exists. Please enter a different e-mail address.";

                case MembershipCreateStatus.InvalidPassword:
                    return "The password provided is invalid. Please enter a valid password value.";

                case MembershipCreateStatus.InvalidEmail:
                    return "The e-mail address provided is invalid. Please check the value and try again.";

                case MembershipCreateStatus.InvalidAnswer:
                    return "The password retrieval answer provided is invalid. Please check the value and try again.";

                case MembershipCreateStatus.InvalidQuestion:
                    return "The password retrieval question provided is invalid. Please check the value and try again.";

                case MembershipCreateStatus.InvalidUserName:
                    return "The user name provided is invalid. Please check the value and try again.";

                case MembershipCreateStatus.ProviderError:
                    return "The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

                case MembershipCreateStatus.UserRejected:
                    return "The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator.";

                default:
                    return "An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator.";
            }
        }
        #endregion
    }
}
